<?php
/**
 * ShopEx licence
 *
 * @copyright  Copyright (c) 2005-2010 ShopEx Technologies Inc. (http://www.shopex.cn)
 * @license  http://ecos.shopex.cn/ ShopEx License
 */

/**
 * 电商退款统一处理入口
 * @auther shopex ecstore dev dev@shopex.cn
 * @version 0.1
 * @package ectools.lib
 */
class ectools_refund extends ectools_operation
{
    /**
     * 私有构造方法，不能直接实例化，只能通过调用getInstance静态方法被构造
     * @params object 当前应用的app对象
     * @return null
     */
    public function __construct($app)
    {
        $this->app = $app;
    }

    /**
     * 最终的克隆方法，禁止克隆本类实例，克隆是抛出异常。
     * @params null
     * @return null
     */
    final public function __clone()
    {
        trigger_error(app::get('ectools')->_("此类对象不能被克隆！"), E_USER_ERROR);
    }

    /**
     * 创建退款单
     * @params array - 订单数据
     * @params obj - 应用对象
     * @params string - 支付单生成的记录
     * @return boolean - 创建成功与否
     */
    public function generate(&$sdf, &$controller=null, &$msg='')
    {
         // 异常处理
        if (!isset($sdf) || !$sdf || !is_array($sdf))
        {
            trigger_error(app::get('ectools')->_("退款单信息不能为空！"), E_USER_ERROR);exit;
        }
        //by 张艳 添加功能，如果该商品没有取消发货，退换货也没有完成的
        $ordersModel=app::get('b2c')->model('orders');
        $redelivery=$ordersModel->getRow('redelivery_status,payed',array('order_id'=>$sdf['order_id']));
        $afterPro=app::get('aftersales')->model('return_product');
        //如果一个订单退货 申请之后拒绝，再申请再拒绝，这样会有很多的退货单
	    //因此上下面这段代码是有问题的,order_id并不唯一
        //$orderStatus=$afterPro->getList('status',array('order_id'=>$sdf['order_id']));
	    //先添加一个这样的判断，在退换货表查找一条，如果订单号存在并且status=4则认为可以通过
        $orderStatus=$afterPro->getRow('status',array('order_id'=>$sdf['order_id'],'status'=>'4'));
        if ($redelivery['redelivery_status'] == '1' && $orderStatus['status']!='4')
        {
            trigger_error(app::get('ectools')->_("该订单没有取消发货或没有退换货成功，不能退款！"), E_USER_ERROR);exit;
        }
        if ($redelivery['payed'] > $sdf['money']) {
            $payStatus = 4;
        }else{
            $payStatus = 5;
        }
        $params = array(
            'member_id'=>$sdf['member_id'],
            'money'=>0-$sdf['money'],
            'advance_type'=>'',
            'mtime'=>date("Y-m-d", time()),
            'payment_id'=>$sdf['refund_id'],
            'order_id'=>$sdf['order_id'],
            'bank_name'=>$sdf['bank_name'],
            'paymethod'=>$sdf['app_name'],            
            'memo'=>$sdf['memo'],
            'pay_status'=>$payStatus,
            'pay_status'=>5,
            //2017-12-11 by jeff,增加一个是否退款的标记，进销存中根据此标记判断是否产生收款记录
            'is_refund'=>true,
        );
        //以下是测试代码,如果支付方式不是预存款支付，且不是退款，需要在进销存中产生收款记录
        //2017-12-11 by jeff
        // $params['paymethod'] = '预存款支付';
        // $params['is_refund'] = 'false';

        // return $params;
        //2015-9-16 by 张艳,在保存前，先同步到jxc,同步成功后才保存到本地
        $obj_order_create = kernel::single("b2c_order_pay");
        $r=$obj_order_create->_get_data_refund($params);
        if($r['rsp']===false) {
            header('Content-Type:text/jcmd; charset=utf-8');
            echo '{error:"'.$r['data']['msg'].'",_:null}';
            exit;
        }
        $is_save = false;

        // 保存的接口方法
        $obj_refund_create = kernel::single("ectools_refund_create");
        $is_save = $obj_refund_create->generate($sdf);

        if (!$is_save)
        {
            $msg = app::get('ectools')->_('退款单生成失败！');
            return false;
        }

		$obj_refund_special = kernel::servicelist('ectools_refund.ectools_mdl_special_refund');
		foreach ($obj_refund_special as $obj_app)
		{
			$is_save = $obj_app->dorefund($sdf);
		}

		if ($is_save)
		{
			$obj_api_refund = kernel::single("ectools_refund_update");
			$sdf['status'] = 'succ';
			$is_save = $obj_api_refund->generate($sdf);

			if (!$is_save)
			{
				$msg = app::get('ectools')->_('退款单编辑失败！');
				return false;
			}
		}

        return $is_save;
    }
}


?>
